home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Compendium Deluxe 2
/
LSD and 17bit Compendium Deluxe - Volume II.iso
/
a
/
prog
/
asmsrc
/
vec_3d.lha
/
vec_3d_filled_glenz.s
< prev
Wrap
Text File
|
1994-06-05
|
14KB
|
722 lines
;example of a Glenz vector, this routine is boring.....
Section Copperlist,code_C
opt c-,o+,w-
opt d+
scale = 200
bgc = $dff1fe
killsys = 1
include "dh0:include/object.i"
Start: lea $dff000,a5 ; hardware base address
Move.w $1c(a5),OldInt ; Save Old Interupts
Move.w $02(a5),OldDma ; Save Old DMA
Move.w #$7fff,$9a(a5) ; Clear DMA
Move.w #$7fff,$96(a5) ; Clear Interupts
Move.w #$7fff,$9c(a5) ; Clear Interupt Requests
Move.b #$7f,$bfed01 ; kill timers (rem me for disk)
Move.l $6c.w,OldV3 ; save level 3 int
Move.l #my_level3,$6c.w ; put new copper interupt
Move.l #my_copper,$80(a5) ; Address of copper 1
Move.w #$c010,$9a(a5) ; Start interupts
Move.w #$83ef,$96(a5) ; Start DMA ( 83ff for disk dma)
Move.w #1,$88(a5) ; Strobe for copper start
.wait move.l $dff004,d0
and.l #$1ff00,d0
cmp.l #$ff00,d0
bne.s .wait
move.l Screen1,d0 ; store address of bitplane0
move.w d0,bitplane0_lo ; into the copper list
swap d0
move.w d0,bitplane0_hi
swap d0
add.l #40*256,d0
move.w d0,bitplane1_lo ; into the copper list
swap d0
move.w d0,bitplane1_hi
swap d0
add.l #40*256,d0
move.w d0,bitplane2_lo ; into the copper list
swap d0
move.w d0,bitplane2_hi
move.l screen1,d0
move.l screen2,screen1
move.l d0,screen2
bsr filled_vectors
btst #2,$dff016
beq .skip
lea cube_3d_1,a3
add.w #4,obj_arot(a3)
and.w #$1fe,obj_arot(a3)
add.w #2,obj_brot(a3)
and.w #$1fe,obj_brot(a3)
add.w #4,obj_crot(a3)
and.w #$1fe,obj_crot(a3)
.skip btst #6,$bfe001
bne .wait
lea $dff000,a5 ; hardware base address
move.l #0,$80(a5) ; blank copper list
move.l #0,$84(a5) ; if gfx lib not open (slayer boot)
move.w #0,$180(a5) ; bgc to black
Move.l OldV3,$6c.w ; restore old l3
Lea GfxLib,a1 ; Pointer to Library Text
move.l 4.w,a6
jsr -132(a6) ; forbid
Move.l 4.w,a6 ; Exec
Moveq.l #0,d0 ; Clear D0
Jsr -$228(a6) ; Open Library
cmp.l #0,d0
beq no_gfx_lib ; if gfx lib not open dont restore copper lib (slayer boot)
Move.l d0,a1
Move.l $26(a1),$80(a5) ; restore copper 1
Move.l $32(a1),$84(a5) ; restore copper 2
no_gfx_lib:
Move.w OldInt,d0 ; start old interupts
Or.w #$8000,d0
Move.w d0,$9a(a5)
Move.w OldDma,d0 ; start old DMA
Or.w #$8000,d0
Move.w d0,$96(a5)
Move.b #$9b,$bfed01 ; Start Timers
Move.l 4.w,a6 ; Close Gfx lib
Jsr -$19e(a6)
move.l 4.w,a6
jsr -138(a6) ; permit
move.w #0,$bfec00 ; clear kbd
Moveq.l #0,d0 ; No errors
Rts ; Exit
Error: moveq #0,d0 ; fin
rts
keys: btst #6,$bfe001
bne.s keys
rts
*****************************************************
my_level3: Movem.l d0-d7/a0-a6,-(a7) ; New copper
Move.w #$10,$dff09c ; Serviced Interupt
Exit: Movem.l (a7)+,d0-d7/a0-a6
Rte ; Return from Interupt
*****************************************************
wait_blit:
.loop Btst #6,$dff002
Bne.s .loop
rts
filled_vectors:
Move.l #scrbuf1,a0
Lea $dff000,a6
bsr wait_blit
move.w #$f00,bgc ; start cls
; and convert 3d ; co-ords to 2d
Move.l #$1f00000,$dff040
Move.l #scrbuf1+4,$dff054
move.l #0,$dff074
move.w #8,$dff066
Move.w #768*64+16,$dff058
lea cube_3d_1,a3
bsr scale_3d
move.w #$888,bgc ; calc which surfaces
; need to be hidden
bsr hide_lines
move.w #$fff,bgc ; wait for blitter
bsr wait_blit
move.w #$00f,bgc ; draw lines
lea cube_3d_1,a3
bsr plot_2d_object
move.w #$800,bgc ; start fill
bsr fill_screen
move.w #$444,bgc ; finished
; but blitter
.wait3 Btst #6,$dff002
Bne.s .wait3
move.w #$000,bgc ; finished
Rts
*************************************
fill_screen:
lea $dff000,a6
lea scrbuf1,a0
move.l screen1,a1
add.l #768*40-6,a0
add.l #768*40-6,a1
bsr wait_blit
move.l #$09f00012,$40(a6) ;set copy/fill/descending mode ;descending mode needed for filling
move.w #8,$64(a6)
move.w #8,$66(a6)
move.l a0,$50(a6) ;vectorplane address
move.l a1,$54(a6) ;bitplane address
move.w #768*64+16,$58(a6) ;set bltsize
rts
*************************************
scale_3d: lea sintable+64,a1
movem.l 0(a3),a4/a5 ; connect, co-ords
move.w 12(a3),d7 ; no of points-1
move.l 36(a3),a6
.loop
**** rotate object *****
movem.w (a5)+,d0-d1 ; get obj x,y
Move d0,d2
Move d1,d3
Move 22(a3),d6 ; c rot
Move 64(a1,d6),d4 ; sine
Move -64(a1,d6),d5 ; cosine
Muls d4,d0
Muls d5,d1
Sub.l d1,d0
Add.l d0,d0
Swap d0 ;d0 holds intermediate x coord
Muls d5,d2
Muls d4,d3
Add.l d3,d2
Add.l d2,d2
Swap d2 ;d2 holds intermediate y coord
Move d2,d4
Move (a5)+,d1 ;z coord
Move d1,d3
Move 18(a3),d6 ; a rot
Move 64(a1,d6),d5 ; sine
Move -64(a1,d6),d6 ; cosine
Muls d5,d2
Muls d6,d1
Sub.l d1,d2
Add.l d2,d2
Swap d2 ;d2 holds the final y coord
Muls d5,d3
Muls d6,d4
Add.l d4,d3
Add.l d3,d3
Swap d3 ;d3 holds intermediate z coord
Move d0,d1
Move d3,d4
Move 20(a3),d6 ; b rot
Move 64(a1,d6),d5 ; sine
Move -64(a1,d6),d6 ; cosine
Muls d5,d3
Muls d6,d0
Sub.l d0,d3
Add.l d3,d3
Swap d3 ;d3 holds the final z coord
Muls d6,d4
Muls d5,d1
Add.l d4,d1
Add.l d1,d1
Swap d1 ;d1 holds the final x coord
**** scale object ****
move.w d3,d5
move.w d2,d4
move.w d1,d3
add.w 24(a3),d3 ; x
add.w 26(a3),d4 ; y
add.w 28(a3),d5 ; z
add.w 30(a3),d5 ; depth
add.w #scale,d5
move.l #scale<<16,d6
divu d5,d6
*** calc x 2d point **
muls d6,d3
add.l d3,d3
swap d3
*** calc y 2d point **
muls d6,d4
add.l d4,d4
swap d4
*** centre of screen **
add.w 32(a3),d3
add.w 34(a3),d4
movem.w d3-d4,(a6)
lea 4(a6),a6
dbf d7,.loop
move.w 14(a3),d7 ; no of lines -1
rts
*************************************
plot_2d_object:
bsr wait_blit
*** setup blitter for line draw ***
move.l #0,$dff040 ; clr blitcon0,blitcon1
Move.l #-1,$dff044 ; fwm, lwm
move.l #0,$dff050 ; a source
Move.w #40,$dff060 ; modo
Move.l #$ffff8000,$dff072 ; line draw fn
move.l 36(a3),a1 ;get coord buffer
move.l 40(a3),a5 ;get surface buffer
move.l 0(a3),a2 ; connect list
move.l 8(a3),a6 ; surface list
move.w 16(a3),no_of_surf ;get number of surfaces on vector
.next_surf move.l (a6)+,d7 ;get number of sides to surface
move.l (a6)+,a4 ;get address of surface list
move.l (a6)+,a0 ;get address of screen memory
move.l (a6)+,multiplane ;is face on more that one plane
; check if surface visible
move.l (a5)+,d0
move.l d0,d6
and.l #$f0000000,d6
beq .glenz
and.l #$0fffffff,d0
cmp.l #scrbuf1+256*40,a0
bgt .dont_draw
lea 256*40(a0),a0
.glenz move.l d0,a4
.loop move.w (a4)+,d5
move.w 0(a2,d5),d6 ; 1st connect
movem.w (a1,d6),d0-d1 ; get x1,y1
move.w 2(a2,d5),d6 ; 2nd connect
movem.w (a1,d6),d2-d3 ; get x2,y2
cmp.w d1,d3
bgt.s .NormalDraw
exg d0,d2
exg d1,d3
beq .NoDraw
.NormalDraw movem.l d0-d7/a0-a6,-(a7)
move.w #40,d5 ; screen width
Lea $dff000,a6
lea filshift,a3 ; pre-calc line-shift table
lea llength,a5 ; pre-calc line-length table
Bsr LineDraw
movem.l (a7)+,d0-d7/a0-a6
.Nodraw dbf d7,.loop
.dont_draw sub.w #1,no_of_surf
bpl .next_surf
rts
*************************************************
hide_lines:
move.l 36(a3),a1 ;get coord-storage area
move.l 40(a3),a5 ;get surface draw buffer
move.l 0(a3),a2 ; connect list
move.l 8(a3),a6 ; surface list
move.w 16(a3),no_of_surf ;get number of surfaces on vector
.next_surf move.l (a6)+,d7 ;get number of sides to surface
move.l (a6)+,a4 ;get address of surface list
move.l (a6)+,a0 ;get address of screen memory
move.l (a6)+,multiplane ;is face on more that one plane
;calculate if surface visible
move.l a4,(a5)
move.w 0(a4),d6 ; get point on surface
move.w 0(a2,d6),d4 ; get connect for point
move.w 2(a2,d6),d5 ; get next connect for point
move.w 0(a1,d4),d0 ; get x screen co-ord for contect
sub.w 0(a1,d5),d0 ; sub y screen co-ord for contect
move.w 2(a1,d4),d1 ; get x screen co-ord for contect
sub.w 2(a1,d5),d1 ; sub y screen co-ord for contect
move.w 2(a4),d6 ; get next point on surface
move.w 0(a2,d6),d4 ; get connect for point
move.w 2(a2,d6),d5 ; get next connect for point
move.w 0(a1,d4),d2 ; get x screen co-ord for contect
sub.w 0(a1,d5),d2 ; sub y screen co-ord for contect
move.w 2(a1,d4),d3 ; get x screen co-ord for contect
sub.w 2(a1,d5),d3 ; sub y screen co-ord for contect
muls d3,d0 ; multi (y-x) co-ord surface connect 2 by (y-x) co-ord surface connect 1
muls d2,d1 ; multi (y-x) co-ord surface connect 2 by (y-x) co-ord surface connect 1
cmp.w d0,d1
bpl .dont_draw
move.l a4,(a5)
or.l #$f0000000,(a5)
.dont_draw lea 4(a5),a5
sub.w #1,no_of_surf
bpl .next_surf
rts
********************************************
** FILLED LINEDRAW ROUTINE **
** **
** PRELOAD : **
** $DFF060=SCREENWIDTH (WORD) **
** $DFF072=-$8000 (LONGWORD) **
** $DFF044=-1 (LONGWORD) **
** **
** INPUT : **
** D0=X1 D1=Y1 D2=X2 D3=Y2 **
** A0=SCREEN ADDRESS **
** A3=X-SHIFT TABLE **
** A5=LINE-SIZE TABLE **
********************************************
LineDraw: movem.w d0/d1/d2/d3/d5,-(a7) ;store coord registers
move.w d1,d4
muls d5,d4
move.w d0,d5
add.l a0,d4
asr.w #3,d5
add.l d5,d4 ; was .w, bug fixed
moveq #0,d5
sub.w d1,d3
sub.w d0,d2
bpl.s .line2
moveq #1,d5
neg.w d2
.line2 move.w d3,d1
add.w d1,d1
cmp.w d2,d1
dbhi d3,.line3
.line3 move.w d3,d1
sub.w d2,d1
bpl.s .line4
exg d2,d3
.line4 addx.w d5,d5
add.w d2,d2
move.w d2,d1
sub.w d3,d2
addx.w d5,d5
add.w d0,d0
.wait Btst #6,$dff002
Bne.s .wait
move.w d2,$52(a6) ; a source
sub.w d3,d2
add.w d3,d3
move.w (a3,d0),$40(a6) ; blitcon0
move.b oct(PC,d5.w),$43(a6) ; blitcon1
move.l d4,$48(a6) ; c source
move.l d4,$54(a6) ; d dest
movem.w d1/d2,$62(a6) ; b mod & a mod
move.w (a5,d3),$58(a6) ; size
movem.w (a7)+,d0/d1/d2/d3/d5 ;restore coords
rts
oct: dc.l $3431353,$b4b1757
********************************************
** SECOND LINE-DRAWER ROUTINE WHEN BOTH **
** PLANES NEEDED FOR SURFACE **
********************************************
linedraw2: move.w d1,d4
muls d5,d4
move.w d0,d5
add.l a0,d4
asr.w #3,d5
add.w d5,d4
moveq #0,d5
sub.w d1,d3
sub.w d0,d2
bpl.s line5
moveq #1,d5
neg.w d2
line5 move.w d3,d1
add.w d1,d1
cmp.w d2,d1
dbhi d3,line6
line6 move.w d3,d1
sub.w d2,d1
bpl.s line7
exg d2,d3
line7 addx.w d5,d5
add.w d2,d2
move.w d2,d1
sub.w d3,d2
addx.w d5,d5
add.w d0,d0
.wait Btst #6,$dff002
Bne.s .wait
move.w d2,$52(a6)
sub.w d3,d2
add.w d3,d3
move.w (a3,d0),$40(a6)
move.b oct(PC,d5.w),$43(a6)
move.l d4,$48(a6)
move.l d4,$54(a6)
movem.w d1/d2,$62(a6)
move.w (a5,d3),$58(a6)
rts
*************************************
Section copdat,Data_c
oldint: dc.l 0
olddma: dc.l 0
oldv3: dc.l 0
my_copper: dc.w $100,$3200 ; 4 bp - lores -
dc.w $102,$00 ; hsr
dc.w $104,0 ; bp control reg
dc.w $108,0 ; bp modulo - odd
dc.w $10a,0 ; bp modulo - even
dc.w $180,0 ; colour 0 to black
dc.w $1fc,0
dc.w $120,0,$122,0
dc.w $124,0,$126,0
dc.w $128,0,$12a,0
dc.w $12c,0,$12e,0
dc.w $130,0,$132,0
dc.w $134,0,$136,0
dc.w $138,0,$13a,0
dc.w $13c,0,$13e,0
dc.w $092,$38 ; bp start horz
dc.w $094,$d0 ; bp stop horz
dc.w $08e,$2c8c ; bp window start left
dc.w $090,$2ae3 ; bp window bot right
cmap: dc.w $180,0
dc.w $182,$f88
dc.w $184,$f44
dc.w $186,$f00
dc.w $188,$4f4
dc.w $18a,$8f8
dc.w $18c,$cfc
dc.w $18e,$fff
dc.w $e0
bitplane0_hi: dc.w 0,$e2
bitplane0_lo: dc.w 0,$e4
bitplane1_hi: dc.w 0,$e6
bitplane1_lo: dc.w 0,$e8
bitplane2_hi: dc.w 0,$ea
bitplane2_lo: dc.w 0
dc.w $0101,$fffe
dc.w $9c,$8010 ; irq set bits - ?
dc.w $ffff,$fffe ; end of copper list
gfxlib: dc.b "graphics.library",0
even
screen1: dc.l screena
screen2: dc.l screenb
***********************************************************************
section stuff,data
a set 0
filshift
REPT 320
dc.w ((a&$f)*$1000)+$a4a
a set a+1
endr
a set 0
llength ;table for line length vals
REPT 320
dc.w a*64+2
a set a+1
ENDR
no_of_surf: dc.l 0
multiplane: dc.l 0
cube_3d_1: dc.l cube_connect
dc.l cube_points
dc.l cube_surfaces
dc.w 8-1 ; points
dc.w 12-1 ; connects
dc.w 12-1 ; surfaces
Dc.w $1ac ; a
Dc.w $e0 ; b
Dc.w $1b6 ; c
Dc.w 0 ; x
Dc.w 0 ; y
Dc.w 0 ; z
dc.w 380 ; depth
dc.w 160 ; scrn x
dc.w 128 ; scrn y
dc.l cube_buff ; buffer for x,y co-ords
dc.l conn_buff ; buffer for connects
cube_points: Dc.w +100,+100,+100
Dc.w -100,+100,+100
Dc.w -100,-100,+100
Dc.w +100,-100,+100
Dc.w +100,+100,-100
Dc.w -100,+100,-100
Dc.w -100,-100,-100
Dc.w +100,-100,-100
cube_connect: Dc.w 0*4,1*4 ; 0
Dc.w 1*4,2*4 ; 1
Dc.w 2*4,3*4 ; 2
Dc.w 3*4,0*4 ; 3
Dc.w 4*4,5*4 ; 4
Dc.w 5*4,6*4 ; 5
Dc.w 6*4,7*4 ; 6
Dc.w 7*4,4*4 ; 7
Dc.w 0*4,4*4 ; 8
Dc.w 1*4,5*4 ; 9
Dc.w 2*4,6*4 ; 10
Dc.w 3*4,7*4 ; 11
dc.w 05*4,07*4 ; 12
dc.w 06*4,04*4 ; 13
dc.w 07*4,00*4 ; 14
dc.w 03*4,04*4 ; 15
dc.w 00*4,05*4 ; 16
dc.w 04*4,01*4 ; 17
dc.w 01*4,06*4 ; 18
dc.w 02*4,05*4 ; 19
dc.w 02*4,07*4 ; 20
dc.w 03*4,06*4 ; 21
dc.w 02*4,00*4 ; 22
dc.w 03*4,01*4 ; 23
cube_s1: dc.w 04*4,12*4,06*4,13*4 ;which connect lines form to make a surface
cube_s2: dc.w 14*4,11*4,15*4,08*4
cube_s3: dc.w 16*4,09*4,17*4,08*4
cube_s4: dc.w 18*4,09*4,19*4,10*4
cube_s5: dc.w 02*4,20*4,06*4,21*4
cube_s6: dc.w 03*4,22*4,01*4,23*4
cube_s7: dc.w 04*4,05*4,06*4,07*4 ;which connecting lines form to make a surface
cube_s8: dc.w 03*4,11*4,07*4,08*4
cube_s9: dc.w 00*4,09*4,04*4,08*4
cube_s10: dc.w 01*4,09*4,05*4,10*4
cube_s11: dc.w 02*4,10*4,06*4,11*4
cube_s12: dc.w 03*4,02*4,01*4,00*4
cube_surfaces: dc.l 4-1,cube_s1,scrbuf1,0
dc.l 4-1,cube_s2,scrbuf1,0
dc.l 4-1,cube_s3,scrbuf1,0
dc.l 4-1,cube_s4,scrbuf1,0
dc.l 4-1,cube_s5,scrbuf1,0
dc.l 4-1,cube_s6,scrbuf1,0
dc.l 4-1,cube_s7,scrbuf1+256*40,0
dc.l 4-1,cube_s8,scrbuf1+256*40,0
dc.l 4-1,cube_s9,scrbuf1+256*40,0
dc.l 4-1,cube_s10,scrbuf1+256*40,0
dc.l 4-1,cube_s11,scrbuf1+256*40,0
dc.l 4-1,cube_s12,scrbuf1+256*40,0
cube_buff: ds.l 10*50
conn_buff: ds.l 10*5
Sintable: incbin "dh0:data/misc/sin.maxi"
incbin "dh0:data/misc/sin.maxi"
section small,bss_c
scrbuf1: ds.l 10*768
screena: ds.l 10*768
screenb: ds.l 10*768
end